﻿using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using ChiDao.Component.Utils;
using ChiDao.Business.Service.Helper.Logging;
using ChiDao.Business.Service.Impl;
using ChiDao.Site.Models;
using ChiDao.Business.Service;
using ChiDao.Business.Models.Account;
using ChiDao.Business.Service.CommonSupport;

namespace ChiDao.Business.Service.AttachAttribute
{
    /// <summary>
    /// 权限拦截（菜单权限、功能权限）
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public class AuthorizeFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 重写Action执行时的逻辑（对权限进行判断）
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }
            var path = filterContext.HttpContext.Request.Path.ToLower();
            if (path == "/" || path == "/Account/Login".ToLower())  //忽略对Login登录页的权限判定
                return;

            //读取WebPageAttribute特性
            object[] attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(WebPageAttribute), true);
            var isWebPage = attrs.Length == 1;  //当前Action请求是否为具体的功能页面

            if (this.AuthorizeCore(filterContext, isWebPage) == false)  //根据验证判断进行处理
            {
                //注：如果未登录直接在URL输入功能权限地址提示不是很友好；如果登录后输入未维护的功能权限地址，那么也可以访问，这个可能会有安全问题
                if (isWebPage == true)
                {
                    filterContext.Result = new HttpUnauthorizedResult();//直接URL输入的页面地址跳转到登陆页
                }
                else
                {
                    filterContext.Result = new ContentResult { Content = @"抱歉,你不具有当前操作的权限！" };  //功能权限弹出提示框（提示框，或者专门的无权限提示页面）
                }
            }
        }

        /// <summary>
        /// 权限判断业务逻辑（未完成）
        /// </summary>
        /// <param name="filterContext"></param>
        /// <param name="isWebPage">是否页面</param>
        /// <returns></returns>
        protected virtual bool AuthorizeCore(ActionExecutingContext filterContext, bool isWebPage)
        {
            if (filterContext.HttpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }
            //判定用户是否登录
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                return false;
            }
            //var user = new CurrentUser();//获取当前用户信息
            var user = SystemData.Instance.CurrentUser;
            if (user == null)
                return false;

            var controllerName = filterContext.RouteData.Values["controller"].ToString();  //取得Controller
            var actionName = filterContext.RouteData.Values["action"].ToString();  //取得Action

            //如果是框架首页，直接返回true（菜单由下面逻辑进行验证）
            if (controllerName.Equals("Main") && actionName.Equals("Index"))
            {
                return true;
            }

            //如果是页面，则进行菜单权限判断
            if (isWebPage)
            {
                //判断菜单是否已经列入权限管理，若未加入权限控制，则视为已授权
                if (SystemData.Instance.MenuInfoes == null || SystemData.Instance.MenuInfoes.Count(m => m.ControllerName == controllerName && m.ActionName == actionName) == 0)
                    return true;

                //判断用户是否有对应的菜单权限
                if (user.MenuInfoes == null || user.MenuInfoes.Count(m => m.ControllerName == controllerName && m.ActionName == actionName) == 0)
                    return false;
            }
            //如果是操作，则进行功能权限判断
            else
            {
                //判断功能是否已经列入权限管理，若未加入权限控制，则视为已授权
                if (SystemData.Instance.ActionInfoes == null || SystemData.Instance.ActionInfoes.Count(m => m.ControllerName == controllerName && m.ActionName == actionName) == 0)
                    return true;

                //如果不是功能页（行为动作），则进行功能（操作）权限判断
                if (user.ActionInfoes == null || user.ActionInfoes.Count(a => a.ControllerName == controllerName && a.ActionName == actionName) == 0)
                    return false;
            }
            return true;
        }
    }
}